艱難地走到第三十天,這次主題比上個主題「作業系統的專武」難寫多了,也比較符合「鐵人」的意義。同事閒聊時有說正則讓她很崩潰,也獲其他同事共鳴,但筆者以為從事系統開發、維運工作,會SQL是基本,會Regex則是加乘自己工作能力,而且不像SQL只能存在於DB,Regex跨足DB、程式語言、編輯器、指令,雖然學習門檻高,但頗有價值,何況現在有ChatGPT輔助,非常鼓勵大家學習。
正則表達式最早是從Perl學的,當時所在公司請一家叫傲爾網的公司利用下班時間來授課,得益於小唐老師唐宗漢精準教導,學會Regex,如同複製一個自己加持工作效率,後來小唐老師從政過一段時間,各有評價,但技術方面目前是我遇過的前三強,非常感謝當時的教導。
感言分享完畢,還是要分享個小小技術經驗,避免划水太過嚴重。
在Java有java.util.regex套件可以針對字串裡符合Pattern的逐一比對,比如字串變數str的值為"ABCDAB",Pattern是AB的話,會符合兩個。而Java String物件的matches方法卻是完整比對,初學時以為matches可以類似substring,比對部份符合字串就可以return true,結果不行,用str.matches("^AB")是不會過。
若遇到str是有換行的字串內容怎麼辦?特別是遇到它是讀檔案進來。
FileInputStream fis = new FileInputStream("./javaue.def");
byte[] ba = new byte[fis.available()];
fis.read(ba);
String javadef = new String(ba);
System.out.println("\nITHome".matches("(?s).+ome"));
System.out.println(javadef.matches("(?s)\\*.+definition"));
用(?s)
進行跨行比對,第一個印出是true,第二個印出卻是false,也用vi檢查javaue.def檔,確定當尾就是definition,並沒有換行。但實際上應該有,所以Pattern加換行字元就變true了。
System.out.println(javadef.matches("(?s)\\*.+definition\n"));
第二個鐵人賽完成,雖然很心虛,但符合Java String的matches完整比對要求,三十天不間斷發文,灑花!!